#ifndef __CAPAINDICES_INDICES_CPP
#define __CAPAINDICES_INDICES_CPP

/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/

#include "Indices.h"
#include <fstream>
#include <sstream>


namespace CapaIndices
{


	Clave::Clave(){
		this->Resultado = new list<Registro>();
		this->RegistrosAfectados = 0;
		this->NombreArchivo = "resultado.tmp";
		this->primerFlush = true;
		this->AtributosASeleccionar = new list<string>();
	}

	Clave::~Clave(){
	}

	void Clave::FlushResultados(bool ignorarTamanio)
	{
		if (Resultado->size()>1 || ignorarTamanio)
		{
			if (primerFlush)
			{
				stringstream sstr;
#ifdef WIN32
				string aux;
				for (string::iterator i = NombreArchivo.begin(); i!=NombreArchivo.end();i++)
					if ((*i) == '/')
						aux += '\\';
					else
						aux += *i;


				sstr << "IF EXIST \""<< aux << "\" DEL \"" << aux << "\"";
				system(sstr.str().c_str());
#else
				sstr << "rm -f " << NombreArchivo;
				system(sstr.str().c_str());
				ofstream* fileTemp = new ofstream(NombreArchivo.c_str(),ios::out);
				fileTemp->close();
				delete fileTemp;
#endif
			}

			ofstream* file = new ofstream(NombreArchivo.c_str(),ios::out | ios::app);//ios::in | ios::app);

			if (primerFlush)
			{
				if (Resultado->size() > 0)
				{
					Registro r = *Resultado->begin();

					if (AtributosASeleccionar->size() > 0)
					{
						for (list<string>::iterator select = AtributosASeleccionar->begin();select != AtributosASeleccionar->end() ; select++)
							for (IteradorDeAtributos iad = r.Atributos.begin();iad != r.Atributos.end() ; iad++)					
								if ((*select) == iad->Nombre)
									*file << iad->Nombre<< ";";					
					}
					else
					{
						for (IteradorDeAtributos iad = r.Atributos.begin();iad != r.Atributos.end() ; iad++)												
							*file << iad->Nombre<< ";";
					}

					*file << endl;

					primerFlush = false;
				}
			}


			for (IteradorDeRegistros r = Resultado->begin(); r != Resultado->end(); r++)
			{
				if (AtributosASeleccionar->size() > 0)
				{
					for (list<string>::iterator select = AtributosASeleccionar->begin();select != AtributosASeleccionar->end() ; select++)
						for (IteradorDeAtributos iad = r->Atributos.begin();iad != r->Atributos.end() ; iad++)
							if ((*select) == iad->Nombre)
								*file << iad->Valor << ";";
				}
				else
				{
					for (IteradorDeAtributos iad = r->Atributos.begin();iad != r->Atributos.end() ; iad++)						
						*file << iad->Valor << ";";
				}

				*file << endl;
			}

			file->close();
			delete file;
			Resultado->clear();
		}

	}

	bool Clave::LeerRegistros(list<Registro>* buffer, ifstream* archivo)
	{
		buffer->clear();		

		if (primerFlush)
		{
			for (IteradorDeRegistros r = Resultado->begin(); r!= Resultado->end(); r++)
				buffer->push_back(*r);
			return false;
		}

		string line;	

		for (int i = 0; i< 10; i++)		
		{
			if(!getline(*archivo,line))
				return false;

			Registro* r = new Registro();

			int j = 0;
			list<string>::iterator it = AtributosASeleccionar->begin();

			while(j < line.size() )
			{
				Atributo* a = new Atributo();				

				while (line[j] != ';')			
					a->Valor += line[j++];

				a->Nombre = *it;
				it++;
				j++;
				r->Atributos.push_back(*a);				
			}

			buffer->push_back(*r);		

		}

		return true;
	}

	void Clave::LeerEncabezado(ifstream* archivo)
	{
		string line;			

		if(!getline(*archivo,line))
			return;

		int j = 0;

		while(j < line.size() )
		{
			string* a = new string();				

			while (line[j] != ';')			
				*a += line[j++];

			j++;

			this->AtributosASeleccionar->push_back(*a);
		}
	}
}

#endif
